package cn.cdeden.common.core.utils.file;

import cn.hutool.core.io.FileUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;

/**
 * 文件处理工具类
 *
 * @author Lion Li
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class FileUtils extends FileUtil {

    /**
     * 下载文件名重新编码
     *
     * @param response     响应对象
     * @param realFileName 真实文件名
     */
    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) {
        String percentEncodedFileName = percentEncode(realFileName);
        String contentDispositionValue = "attachment; filename=%s;filename*=utf-8''%s".formatted(percentEncodedFileName, percentEncodedFileName);
        response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
        response.setHeader("Content-disposition", contentDispositionValue);
        response.setHeader("download-filename", percentEncodedFileName);
    }

    /**
     * 百分号编码工具方法
     *
     * @param s 需要百分号编码的字符串
     * @return 百分号编码后的字符串
     */
    public static String percentEncode(String s) {
        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8);
        return encode.replaceAll("\\+", "%20");
    }


    // 创建一个HashMap，用于存储文件类型和对应的MIME类型
    private static final Map<String, String> magicNumbers = new HashMap<>();

    static {
        magicNumbers.put("FFD8FF", "jpg");
        magicNumbers.put("89504E47", "png");
        magicNumbers.put("47494638", "gif");
    }


    /**
     * 获取 文件类型
     *
     * @param coverImage
     * @return
     * @throws IOException
     */
    public static String getContentType(InputStream coverImage) throws IOException {
        if (coverImage == null) {
            return null;
        }
        byte[] buffer = new byte[8];
        coverImage.read(buffer, 0, 8);
        for (String key : magicNumbers.keySet()) {
            if (new String(buffer, 0, buffer.length).equals(key)) {
                return magicNumbers.get(key);
            }
        }
        return null; // 如果无法匹配任何已知类型，返回"null"
    }

    /**
     * 判断文件是否是图片
     *
     * @param file
     * @return
     */
//    public static boolean isImage(InputStream file) {
//        try {
//            BufferedImage img = ImageIO.read(file);
//            if (img != null) {
//                return true;
//            }
//        } catch (IOException e) {
//            // 文件无法读取，可能是因为不是图片格式或其他IO错误
//        }
//        return false;
//    }


    /**
     * 判断文件是否是图片（确保流指针重置）
     *
     * @param input 输入流，调用后指针会被重置到原始位置
     * @return 是否为图片
     */
    public static boolean isImage(InputStream input) {
        if (input == null) {
            return false;
        }
        // 如果流不支持mark，则包装为BufferedInputStream
        if (!input.markSupported()) {
            input = new BufferedInputStream(input);
        }
        try {
            // 标记当前位置，允许读取后重置
            input.mark(Integer.MAX_VALUE);
            BufferedImage img = ImageIO.read(input);
            return img != null;
        } catch (IOException e) {
            return false;
        } finally {
            try {
                input.reset(); // 重置流到标记位置
            } catch (IOException e) {
                // 重置失败处理（如关闭的流）
            }
        }
    }

    /**
     * 修改 MultipartFile的 文件名
     *
     * @param originalFile
     * @param newFileName
     * @return
     */
    public static MultipartFile changeFileName(MultipartFile originalFile, String newFileName) {
        // 获取原始文件名
        String originalFileName = originalFile.getOriginalFilename();

        // 获取文件类型
        String contentType = originalFile.getContentType();

        // 获取文件内容
        byte[] content;
        try {
            content = originalFile.getBytes();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

        // 创建新的MultipartFile对象，使用新的文件名
        MultipartFile newFile = new MultipartFile() {
            @Override
            public String getName() {
                return originalFile.getName();
            }

            @Override
            public String getOriginalFilename() {
                return newFileName; // 使用新文件名
            }

            @Override
            public String getContentType() {
                return contentType;
            }

            @Override
            public boolean isEmpty() {
                return content.length == 0;
            }

            @Override
            public long getSize() {
                return content.length;
            }

            @Override
            public byte[] getBytes() throws IOException {
                return content;
            }

            @Override
            public InputStream getInputStream() throws IOException {
                return new ByteArrayInputStream(content);
            }

            @Override
            public void transferTo(File dest) throws IOException, IllegalStateException {
                Files.write(dest.toPath(), content);
            }
        };
        return newFile;
    }


}
